package de.syfy.project.game.base;

import java.util.Random;

/**
 * die IMBA klasse, von der alle Weapon, Cloth etc erben
 * @author felixspielmann
 */
public abstract class EquipObject implements Tradeable , Useable ,Equipable{

    /**
     * Name des Gegenstandes
     */
    String name;
    
    /**
     * an welchen Charakter gebunden?
     */
    private Character besitzer;
    
    /**
     * Preis
     */
    private double price;  
    
    /**
     * Abnutzung? !! Und nur ganze %
     */
    private int durability;  
    
    /**
     * Wertigkeit / Wieviele Punkte verteilt werden können
     */
    private int eqPoints; 
    
    /**
     * Gewicht
     */
    private double weight;
    
    /**
     * größe des Gegenstandes
     */
    private int size;
    
    /**
     * Werte des gegenstandes
     */
    private CharacterValue values;
    
    /**
     * Konstruktor für equipmentpunkte (also Zufalls-werte)
     * @param eqPoints 
     */
    public EquipObject(int eqPoints){
        // Preis soll abhängig von der "Leistung" der Ausrüstung sein  
        this.price = eqPoints*0.1; 
        this.eqPoints = eqPoints;
        this.durability = 100; // in %
        
    }
    
    public EquipObject(int eqPoints , int dura){
        this.eqPoints = eqPoints;
        this.durability = dura;
        this.price = eqPoints * dura/1000;
    }
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    /**
     * verteilt komplett zufällig die EquipmentPoints
     */
    public void randomRandomObject(){
        Random r = new Random();
        int in = r.nextInt(eqPoints);
        int ch = r.nextInt(eqPoints);
        int st = r.nextInt(eqPoints);
        int ko = r.nextInt(eqPoints); 
        int ge = r.nextInt(eqPoints);
        while((in+ch+st+ko+ge)> eqPoints){
            if (in > 0 && ((in+ch+st+ko+ge)>eqPoints)) {
                in-=1;
            }
            if (ch > 0 && ((in+ch+st+ko+ge)>eqPoints)) {
                ch-=1;
            }
            if (st > 0 && ((in+ch+st+ko+ge)>eqPoints)) {
                st-=1;
            }
            if (ko > 0 && ((in+ch+st+ko+ge)>eqPoints)) {
                ko-=1;
            }   
            if (ge > 0 && ((in+ch+st+ko+ge)>eqPoints)) {
                ge-=1;
            }   
        }   
        this.setValues(new CharacterValue(in, ch, st, ko,ge));
    }
    
    public void setValues(CharacterValue value){
        this.values = value;
    }
    
    @Override
    public double getPrice(){
        return price;
    }
    
    @Override
    public void setPrice(double newPrice){
        this.price = newPrice;
    }    
    
    @Override
    public void setDurability(int durability) {
        this.durability = durability;
    }
    
    @Override
    public int getDurability(){
        return this.durability;
    }
   
    @Override
    public int getEqPoints(){
        return eqPoints;
    }
    
    /**
     * Beim ausrüstuen werden die Waffenwerte den Charakterwerten hinzugefügt.
     */
    @Override
    public void onEquip(){
        
        if (besitzer != null) {
            besitzer.getCharValue().add(values);
        }
        
    }
    
    /**
     * beim abrüsten werden die Waffenwerte von den Charakterwerten wieder abgezogen.
     */
    @Override
    public void onDequip(){
        if (besitzer != null) {
            besitzer.getCharValue().sub(values);
        }  
        
    }
    
    /**
     * Wechsel des Besitzers
     * @param newCustomer 
     */
    @Override
    public void change(Character newCustomer){
        this.onDequip();
        this.besitzer = newCustomer;
        this.onEquip();
    }

    public CharacterValue getValues() {
        return values;
    }
    
}
